﻿/***************************
 * Author：peiyang
 * DateTime：
 * Description：<Description>
 * Copyright：臭皮匠工作室@2020
 **/

using System.Collections.Generic;
using Cpjit.SunnyPaine.Toolkit.RabbitMQ.Enums;
using Cpjit.SunnyPaine.Toolkit.RabbitMQ.Model;

namespace Cpjit.SunnyPaine.Toolkit.RabbitMQ.Impl
{
    /// <summary>
    /// 消费者的公共信息抽象类。
    /// </summary>
    public abstract class AbstractConsumer : IConsumer
    {
        /// <summary>
        /// 程序是否运行。
        /// </summary>
        public bool IsRunning { get; set; }

        /// <summary>
        /// 消息通道。
        /// </summary>
        public virtual ConsumerMetaObject MetaObject { get; set; }

        /// <summary>
        /// RabbitMQ客户端对象。
        /// </summary>
        public IRabbitmqClient RabbitmqClient { get; set; }

        /// <summary>
        /// 消息工作模式。
        /// </summary>
        public virtual WorkMode Mode { get; set; }

        /// <summary>
        /// 交换器名称。如果消息工作模式基于交换器的话。
        /// </summary>
        public virtual string ExchangeName { get; set; }

        /// <summary>
        /// 队列名称。
        /// </summary>
        public virtual string QueueName { get; set; }

        /// <summary>
        /// 路由键，如果消息工作模式基于交换器的定向路由模式（direct）的话。通配符，如果消息工作模式基于交换器的通配符模式（topic）的话。
        /// </summary>
        public virtual string RoutingKey { get; set; }

        /// <summary>
        /// 消费者消费消息后是否自动应答。默认true。
        /// </summary>
        public virtual bool AutoAck { get; set; } = true;

        /// <summary>
        /// 附加属性。
        /// </summary>
        public virtual IDictionary<string, object> Arguments { get; set; }

        /// <summary>
        /// 是否订阅。true：订阅，false：不订阅。
        /// <para>如果为false，即便是实现了IConsumer接口也不会订阅消息。</para>
        /// </summary>
        public virtual bool IsSubscribed { get; set; } = true;


        /// <summary>
        /// 接收消息。
        /// </summary>
        /// <param name="client">表示句柄对象。</param>
        /// <param name="args">接收的消息数据事件信息。</param>
        public abstract void Receive(IRabbitmqClient client, DataEventArgs args);

        /// <summary>
        /// 释放。IDisposable成员。
        /// </summary>
        public virtual void Dispose()
        {
        }
    }
}